#ifndef __FTRACE_H__
#define __FTRACE_H__

#include <elf.h>
#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include <assert.h>
#include <stdlib.h>

#include "utils.h"
#include "elf-parser.h"

#define FUNC_TABLE_SIZE 2048
#define FUNC_NAME_LEN 256

typedef struct __FrameEntry__ {
	word_t src_addr;		// 当前指令所在地址
	word_t dst_addr;		// 将要跳转到的地址, 即目标地址
	FuncInfo* src_func;		// 当前指令所处的函数
	FuncInfo* dst_func;		// 目标地址指令所在函数
	int type;				// 指令类型: call / return
} FrameEntry;

/* copy from nanos fs.c */
typedef struct __RamDiskFileInfo__ {
	/* 由 navy 提供 */
	char *name;			// 文件名
	size_t size;		// 文件大小
	size_t disk_offset;	// 文件在 ramdisk 中的偏移
} RamDiskFileInfo;

enum ActionType { ActionCall, ActionReturn };

void init_ftrace(const char* elf, const char* ramdisk, const char* appname);
void append_call_frame(word_t src_addr, word_t dst_addr);
void append_return_frame(word_t src_addr, word_t dst_addr);
void print_ftrace();

#endif